package controller

import (
	"context"

	"net/http"
	"path"

	"web/global"
	"web/proto/myregister"
	"web/proto/myuser"

	"web/utils"

	"github.com/gin-contrib/sessions"
	"github.com/micro/micro/v3/service"

	"github.com/gin-gonic/gin"
)

func GetSession(ctx *gin.Context) {
	//构造未登录
	resp := make(map[string]interface{})

	//查询session数据,如果查询到了,返回数据
	//初始化session对象
	session := sessions.Default(ctx)

	//获取session数据
	userName := session.Get("userName")
	if userName == nil {
		resp["errno"] = utils.RECODE_LOGINERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_LOGINERR)
	} else {
		resp["errno"] = utils.RECODE_OK
		resp["errmsg"] = utils.RecodeText(utils.RECODE_OK)

		//可以是结构体,可以是map
		tempMap := make(map[string]interface{})
		tempMap["name"] = userName.(string)

		resp["data"] = tempMap
	}

	ctx.JSON(http.StatusOK, resp)

}

type LogStu struct {
	Mobile   string `json:"mobile"`
	PassWord string `json:"password"`
}

//登录业务
func PostLogin(ctx *gin.Context) {
	//获取数据
	var log LogStu
	resp := make(map[string]string)
	defer ctx.JSON(http.StatusOK, resp)
	err := ctx.Bind(&log)
	//校验数据
	if err != nil {
		global.GlobalLog.Error(context.Background(), "获取数据失败:", err)

		resp["errno"] = utils.RECODE_LOGINERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_LOGINERR)
		return
	}

	srv := service.New()

	client := myregister.NewRegisterService("register", srv.Client())

	rsp, err := client.Login(context.Background(), &myregister.RegRequest{
		Mobile:   log.Mobile,
		Password: log.PassWord,
	})
	//获取数据库数据
	if err != nil {
		global.GlobalLog.Error(context.Background(), "login错误:", err)
		resp["errno"] = utils.RECODE_DBERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_DBERR)
		return
	}
	//把数据返回给前端
	resp["errno"] = rsp.Errno
	resp["errmsg"] = rsp.Errmsg

	//返回数据  存储session  并返回数据给web端
	session := sessions.Default(ctx)
	session.Set("userName", rsp.Name)
	session.Save()
}

//退出登录
func DeleteSession(ctx *gin.Context) {
	//删除session
	session := sessions.Default(ctx)

	//删除session
	session.Delete("userName")
	err := session.Save()

	resp := make(map[string]interface{})
	defer ctx.JSON(http.StatusOK, resp)
	if err != nil {
		global.GlobalLog.Error(context.Background(), "删除session错误:", err)
		resp["errno"] = utils.RECODE_DATAERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_DATAERR)
		return
	}

	resp["errno"] = utils.RECODE_OK
	resp["errmsg"] = utils.RecodeText(utils.RECODE_OK)
}

//获取用户信息
func GetUserInfo(ctx *gin.Context) {

	resp := make(map[string]interface{})
	defer ctx.JSON(http.StatusOK, resp)
	//获取session数据
	session := sessions.Default(ctx)
	userName := session.Get("userName")

	srv := service.New()

	client := myuser.NewUserService("user", srv.Client())

	rsp, err := client.MicroGetUser(context.Background(), &myuser.Request{Name: userName.(string)})
	//获取数据库数据
	if err != nil {
		global.GlobalLog.Error(context.Background(), "获取用户信息错误:", err)
		resp["errno"] = utils.RECODE_DBERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_DBERR)
		return
	}
	//把数据返回给前端
	resp["errno"] = rsp.Errno
	resp["errmsg"] = rsp.Errmsg
	resp["data"] = rsp.Data
}

type UpdateStu struct {
	Name string `json:"name"`
}

//更新用户名
func PutUserInfo(ctx *gin.Context) {
	//获取数据
	var nameData UpdateStu
	resp := make(map[string]interface{})
	defer ctx.JSON(http.StatusOK, resp)
	err := ctx.Bind(&nameData)
	//校验数据
	if err != nil {
		global.GlobalLog.Error(context.Background(), "获取数据错误:", err)

		resp["errno"] = utils.RECODE_DATAERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_DATAERR)
		return
	}

	//从session中获取原来的用户名
	session := sessions.Default(ctx)
	userName := session.Get("userName")

	srv := service.New()

	client := myuser.NewUserService("user", srv.Client())

	rsp, err := client.UpdateUserName(context.Background(), &myuser.UpdateReq{
		NewName: nameData.Name,
		OldName: userName.(string),
	})
	//获取数据库数据
	if err != nil {
		global.GlobalLog.Error(context.Background(), "获取用户信息错误:", err)
		resp["errno"] = utils.RECODE_DBERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_DBERR)
		return
	}
	//把数据返回给前端
	resp["errno"] = rsp.Errno
	resp["errmsg"] = rsp.Errmsg
	resp["data"] = rsp.Data
	//更新session数据
	if rsp.Errno == utils.RECODE_OK {
		//更新成功,session中的用户名也需要更新一下
		session.Set("userName", nameData.Name)
		session.Save()
	}

}

//上传用户头像
func PostAvatar(ctx *gin.Context) {

	//获取数据  获取图片  文件流  文件头  err
	fileHeader, err := ctx.FormFile("avatar")

	resp := make(map[string]interface{})
	defer ctx.JSON(http.StatusOK, resp)
	//检验数据
	if err != nil {
		global.GlobalLog.Error(context.Background(), "上传用户头像错误:", err)
		resp["errno"] = utils.RECODE_DATAERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_DATAERR)
		return
	}

	//三种校验 大小,类型,防止重名  fastdfs
	if fileHeader.Size > 50000000 {
		global.GlobalLog.Error(context.Background(), "上传文件过大")

		resp["errno"] = utils.RECODE_DATAERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_DATAERR)
		return
	}

	fileExt := path.Ext(fileHeader.Filename)
	if fileExt != ".png" && fileExt != ".jpg" && fileExt != ".jpeg" {
		global.GlobalLog.Error(context.Background(), "上传文件类型错误")
		resp["errno"] = utils.RECODE_DATAERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_DATAERR)
		return
	}
	//只读的文件指针
	file, _ := fileHeader.Open()
	buf := make([]byte, fileHeader.Size)
	file.Read(buf)

	// 获取用户名
	session := sessions.Default(ctx)
	userName := session.Get("userName")

	srv := service.New()

	client := myuser.NewUserService("user", srv.Client())

	rsp, err := client.UploadAvatar(context.Background(), &myuser.UploadReq{
		Avatar:   buf,
		UserName: userName.(string),
		FileExt:  fileExt,
	})
	//获取数据库数据
	if err != nil {
		global.GlobalLog.Error(context.Background(), "获取用户信息错误:", err)
		resp["errno"] = utils.RECODE_DBERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_DBERR)
		return
	}
	//把数据返回给前端
	resp["errno"] = rsp.Errno
	resp["errmsg"] = rsp.Errmsg
	resp["data"] = rsp.Data
}

type AuthStu struct {
	IdCard   string `json:"id_card"`
	RealName string `json:"real_name"`
}

func PutUserAuth(ctx *gin.Context) {
	//获取数据
	var auth AuthStu
	resp := make(map[string]interface{})
	defer ctx.JSON(http.StatusOK, resp)
	err := ctx.Bind(&auth)
	//校验数据
	if err != nil {
		global.GlobalLog.Error(context.Background(), "获取数据错误:", err)

		resp["errno"] = utils.RECODE_DATAERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_DATAERR)
		return
	}

	session := sessions.Default(ctx)
	userName := session.Get("userName")

	srv := service.New()

	client := myuser.NewUserService("user", srv.Client())

	rsp, err := client.AuthUpdate(context.Background(), &myuser.AuthReq{
		RealName: auth.RealName,
		UserName: userName.(string),
		IdCard:   auth.IdCard,
	})
	//获取数据库数据
	if err != nil {
		global.GlobalLog.Error(context.Background(), "获取用户信息错误:", err)
		resp["errno"] = utils.RECODE_DBERR
		resp["errmsg"] = utils.RecodeText(utils.RECODE_DBERR)
		return
	}
	//把数据返回给前端
	resp["errno"] = rsp.Errno
	resp["errmsg"] = rsp.Errmsg
}
